home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
charpal
/
charpal.asm
next >
Wrap
Assembly Source File
|
1995-02-07
|
17KB
|
826 lines
; charpal.asm 1994.11.18
; CHARacter PALlet
; Towns のアナログパレット
; を操作して、DOS モード
; (R50互換表示画面モード)
; での文字色,背景色を変更
.186
; 1994/11/18 ver 1.0 初版
; 1994/11/18 ver 1.1 レイア0/1優先順位入替え
; 1994/11/23 ver 1.3 Nifty:FOAU2 DL公開版 背景拡大機能追加
; 1995/01/06 ver 1.4 31KHzモード追加
; 1995/02/06 ver 1.5 フリコレ10 応募版(C L オプション追加)
cgroup group _TEXT,_DATA,_BSS
_TEXT segment byte public 'CODE'
; コードセグメント
assume cs:cgroup,ds:cgroup
org 0100h
_TEXT ends
_DATA segment word public 'CODE'
; メッセージ、変数セグメント
assume cs:cgroup,ds:cgroup
_DATA ends
_BSS segment word public 'CODE'
; 未初期化領域セグメント
assume cs:cgroup,ds:cgroup
work_buff db ?
_BSS ends
; キャリッジリタン定義
cr equ 13
; ラインフィード定義
lf equ 10
; エンドオブストリング定義
eos equ '$'
; エスケープ
esca equ 1bh
; I/O アドレス
; アナログ
; CRTCアドレス
CRTC_ADR_REG equ 00440h
; CRTCデータ
CRTC_DAT_REG equ 00442h
HDS1 equ 11
HDE1 equ 12
VDS1 equ 15
VDE1 equ 16
FA1 equ 21
; パレットコードレジスタ
PLT_COD_REG equ 0fd90h
; 青色パレットレジスタ
;PLT_BLU_REG equ 0fd92h
; 赤色パレットレジスタ
;PLT_RED_REG equ 0fd94h
; 緑色パレットレジスタ
;PLT_GRN_REG equ 0fd96h
; ビデオ出力I/O制御
; アドレスレジスタ
V_IO_AD_REG equ 00448h
; ビデオ出力I/O制御
; データレジスタ
V_IO_DA_REG equ 0044Ah
; コントロール
; レジスタ番号
;CTRL_REG equ 00b ; 未使用
; プライオリティ
; レジスタ番号
PRIO_REG equ 01b
; レイア0用(背景)
; 16色パレット選択
; YS無効
; レイア0 前面
PLT0_SEL equ 00001000b
; レイア1用(文字)
; 16色パレット選択
; YS無効
; レイア0 前面
PLT1_SEL equ 00101000b
_DATA segment word public 'CODE'
; オプション存在フラグ
option dw 0
Doption dw 0
; 起動メッセージ
c_mes db 'Character Palette ver.1.5 (c)1994. Boko.'
db cr,lf
db esca,'[0m'
db ' 0'
db esca,'[30m'
db ' '
db esca,'[0m'
db ' 1'
db esca,'[34m'
db '■'
db esca,'[0m'
db ' 2'
db esca,'[31m'
db '■'
db esca,'[0m'
db ' 3'
db esca,'[35m'
db '■'
db esca,'[0m'
db ' 4'
db esca,'[32m'
db '■'
db esca,'[0m'
db ' 5'
db esca,'[36m'
db '■'
db esca,'[0m'
db ' 6'
db esca,'[33m'
db '■'
db esca,'[0m'
db ' 7'
db esca,'[37m'
db '■'
db esca,'[0m'
db ' 8'
db esca,'[30;1m'
db '■'
db esca,'[0m'
db ' 9'
db esca,'[34;1m'
db '■'
db esca,'[0m'
db ' A'
db esca,'[31;1m'
db '■'
db esca,'[0m'
db ' B'
db esca,'[35;1m'
db '■'
db esca,'[0m'
db ' C'
db esca,'[32;1m'
db '■'
db esca,'[0m'
db ' D'
db esca,'[36;1m'
db '■'
db esca,'[0m'
db ' E'
db esca,'[33;1m'
db '■'
db esca,'[0m'
db ' F'
db esca,'[37;1m'
db '■'
db esca,'[0m'
db '$'
db 1Ah
db eos
help_mes db cr,lf
db cr,lf
db 'CHARPAL.COM は画面の文字色/背景色を変える'
db 'プログラムです。FM Townsシリーズ専用です。',cr,lf
db '使用法:charpal [<カラーセット名>] [Dn][Ln][Cxxxx[Cxxxx・・・]]',cr,lf
db cr,lf
db 'charpal INIT',09h,':文字色/背景色を初期状態に戻します',cr,lf
db 09H,'MONO',09h,':白地に黒文字。モノクロ8階調',cr,lf
db 09H,'NEGA',09h,':白地に黒文字。標準状態のネガ',cr,lf
db 09H,'PASTEL',09h,':緑地に白文字。黒板とチョークの文字風',cr,lf
db 09H,'GREEN',09h,':緑単色。グリーンディスプレイ風',cr,lf
db 09H,'PLASMA',09h,':オレンジ色単色。プラズマディスプレイ風',cr,lf
db 09H,'TROPICAL:青地に白文字。FM-OASYS風',cr,lf
db cr,lf
db 09h,'D0',09h,':背景の広さを元にもどす',cr,lf
db 09h,'D1',09h,':背景を広くする(24KHz) グレーTownsのデフォルト',cr,lf
db 09h,'D2',09h,':背景を広くする(31KHz) 白いTownsのデフォルト',cr,lf
db 09h,'L0',09h,':画面の上下の線を消す',cr,lf
db 09h,'L1',09h,':画面の上下に線を描く',cr,lf
db 09h,'CpBRG',09h,':色の設定を詳細にできます。',cr,lf
db 09h,09h,'パレット番号,青の輝度,赤の輝度,緑の輝度'
db ' を16進数で指定します。',cr,lf
db 09h,09h,'ex. C00FFC70F0(背景:黄色、文字:赤)'
db eos
; CRTC コントロールデータ
; その0 24KHz 画面
; R50互換モードのデフォルト値
CRT_DATA_0 dw 00040H ; 00 HSW1 水平同期幅1
dw 00320H ; 01 HSW2 水平同期幅2
dw 00000H ; 02 dummy
dw 00000H ; 03 dummy
dw 0035FH ; 04 HST 水平同期周期
dw 00000H ; 05 VST1 垂直同期時間1
dw 00010H ; 06 VST2 垂直同期時間2
dw 00000H ; 07 EET 等化パルス有効時間
dw 0036FH ; 08 VST 垂直同期周期
dw 0009CH ; 09 HDS0 水平表示開始0
dw 0031CH ; 0A HDE0 水平表示終了0
dw 0009CH ; 0B HDS1 水平表示開始1
dw 0031CH ; 0C HDE1 水平表示終了1
dw 00040H ; 0D VDS0 垂直表示開始0
dw 00360H ; 0E VDE0 垂直表示終了0
dw 00040H ; 0F VDS1 垂直表示開始1
dw 00360H ; 10 VDE1 垂直表示終了1
dw 00000H ; 11 FA0 フレーム先頭0
dw 0009CH ; 12 HAJ0 水平アジャスト0
dw 00000H ; 13 FO0 フィールド間オフセット0
dw 00050H ; 14 LO0 ライン間オフセット0
dw 00000H ; 15 FA1 フレーム先頭1
dw 0009CH ; 16 HAJ1 水平アジャスト1
dw 00000H ; 17 FO1 フィールド間オフセット1
dw 00080H ; 18 LO1 ライン間オフセット1
dw 0004AH ; 19 EHAJ 外部同期水平ADJ
dw 00001H ; 1A EVAJ 外部同期垂直ADJ
dw 00000H ; 1B ZOOM 水平垂直拡大
dw 0801FH ; 1C CR0 コントロール0
dw 00003H ; 1D CR1 コントロール1
dw 00000H ; 1E FR ダミーレジスタ
dw 00150H ; 1F CR2 コントロール2
; CRTC コントロールデータ
; その1 24KHz 画面
; 上下左右に約1文字分ずつ
; 画面表示領域を広げる
CRT_DATA_1 dw 00040H ; 00 HSW1 水平同期幅1
dw 00320H ; 01 HSW2 水平同期幅2
dw 00000H ; 02 dummy
dw 00000H ; 03 dummy
dw 0035FH ; 04 HST 水平同期周期
dw 00000H ; 05 VST1 垂直同期時間1
dw 00010H ; 06 VST2 垂直同期時間2
dw 00000H ; 07 EET 等化パルス有効時間
dw 0036FH ; 08 VST 垂直同期周期
dw 0009CH ; 09 HDS0 水平表示開始0
dw 0031CH ; 0A HDE0 水平表示終了0
dw 00088H ; 0B HDS1 水平表示開始1 default 0009CH
dw 00330H ; 0C HDE1 水平表示終了1 default 0031CH
dw 00036H ; 0D VDS0 垂直表示開始0
dw 00368H ; 0E VDE0 垂直表示終了0
dw 00028H ; 0F VDS1 垂直表示開始1 default 00040H
dw 00370H ; 10 VDE1 垂直表示終了1 default 00360H
dw 00000H ; 11 FA0 フレーム先頭0
dw 0009CH ; 12 HAJ0 水平アジャスト0
dw 00000H ; 13 FO0 フィールド間オフセット0
dw 00050H ; 14 LO0 ライン間オフセット0
dw 0FA00H ; 15 FA1 フレーム先頭1 default 00000H
dw 0009CH ; 16 HAJ1 水平アジャスト1
dw 00000H ; 17 FO1 フィールド間オフセット1
dw 00080H ; 18 LO1 ライン間オフセット1
dw 0004AH ; 19 EHAJ 外部同期水平ADJ
dw 00001H ; 1A EVAJ 外部同期垂直ADJ
dw 00000H ; 1B ZOOM 水平垂直拡大
dw 0801FH ; 1C CR0 コントロール0
dw 00003H ; 1D CR1 コントロール1
dw 00000H ; 1E FR ダミーレジスタ
dw 00150H ; 1F CR2 コントロール2
; CRTC コントロールデータ
; その2 31KHz 画面
; 背景をほぼ全画面まで広げる
CRT_DATA_2 dw 00060H ; 00 HSW1 水平同期幅1
dw 002C0H ; 01 HSW2 水平同期幅2
dw 00000H ; 02 dummy
dw 00000H ; 03 dummy
dw 0031FH ; 04 HST 水平同期周期
dw 00000H ; 05 VST1 垂直同期時間1
dw 00004H ; 06 VST2 垂直同期時間2
dw 00000H ; 07 EET 等化パルス有効時間
dw 00419H ; 08 VST 垂直同期周期
dw 0008AH ; 09 HDS0 水平表示開始0
dw 0030AH ; 0A HDE0 水平表示終了0
dw 00070H ; 0B HDS1 水平表示開始1 default 0008Ah
dw 00320H ; 0C HDE1 水平表示終了1 default 0030Ah
dw 00046H ; 0D VDS0 垂直表示開始0
dw 00406H ; 0E VDE0 垂直表示終了0
dw 00026H ; 0F VDS1 垂直表示開始1 default 00046h
dw 00416H ; 10 VDE1 垂直表示終了1 default 00406h
dw 0F4C0H ; 11 FA0 フレーム先頭0 default 00000h
dw 0008AH ; 12 HAJ0 水平アジャスト0
dw 00000H ; 13 FO0 フィールド間オフセット0
dw 00050H ; 14 LO0 ライン間オフセット0
dw 0E400H ; 15 FA1 フレーム先頭1 default 00000h
dw 0008AH ; 16 HAJ1 水平アジャスト1
dw 00000H ; 17 FO1 フィールド間オフセット1
dw 00080H ; 18 LO1 ライン間オフセット1
dw 00058H ; 19 EHAJ 外部同期水平ADJ
dw 00001H ; 1A EVAJ 外部同期垂直ADJ
dw 00000H ; 1B ZOOM 水平垂直拡大
dw 0801FH ; 1C CR0 コントロール0
dw 00002H ; 1D CR1 コントロール1
dw 00000H ; 1E FR ダミーレジスタ
dw 00192H ; 1F CR2 コントロール2
; パレットデータ
; パレット緑(4bit) B15-B12
; パレット赤(4bit) B11-B08
; パレット青(4bit) B07-B04
; パレットコード(4bit)B03-B00
; バレットデータ16ビット × 16色分 × 2プレーン
PAL_DATA:
db 'MONO',0
dw 0FFF0h ; 黒 → 白(明るい)
dw 0DDD1h ; 青 ↓
dw 0BBB2h ; 赤 ↓
dw 09993h ; マゼンダ ↓
dw 07774h ; 緑 → グレー
dw 05555h ; 黄 ↓
dw 03336h ; 水 ↓
dw 01117h ; 白 → 黒(暗い)
dw 0FFF8h ; グレー
dw 0EEE9h ; 高赤
dw 0DDDAh ; 高青
dw 0888Bh ; 高マゼンダ
dw 0666Ch ; 高緑
dw 0222Dh ; 高黄
dw 0111Eh ; 高水
dw 0000Fh ; 高白
db 'NEGA',0
dw 0EEE0h ; 黒 → 白
dw 0DD01h ; 青 → 黄
dw 0D0D2h ; 赤 → 水
dw 0D003h ; マゼンダ → 緑
dw 00DD4h ; 緑 → マゼンダ
dw 00D05h ; 水 → 赤
dw 000D6h ; 黄 → 青
dw 01117h ; 白 → 黒
dw 0EEE8h ; グレー
dw 0DD09h ; 高赤
dw 0D0DAh ; 高青
dw 0D00Bh ; 高マゼンダ
dw 00DDCh ; 高緑
dw 00D0Dh ; 高黄
dw 000DEh ; 高水
dw 0000Fh ; 高白
db 'PASTEL',0
dw 06220h ; 黒 → 緑
dw 099F1h ; 赤 → パステル赤
dw 09F92h ; 青 → パステル青
dw 09FF3h ; マゼンダ →パステルマゼンダ
dw 0F994h ; 緑 → パステル緑
dw 0F9F5h ; 黄 → パステル黄
dw 0FF96h ; 水 → パステル水
dw 0FFF7h ; 白 → 白
dw 08228h ; グレー
dw 099F9h ; 青
dw 09F9Ah ; 赤
dw 09FFBh ; マゼンダ
dw 0F99Ch ; 緑
dw 0F9FDh ; 黄
dw 0FF9Eh ; 水
dw 0FFFFh ; 白
db 'GREEN',0
dw 01000h ; 黒 暗い緑
dw 03001h ; 青 ↓
dw 05002h ; 赤 ↓
dw 07003h ; マゼンダ↓
dw 09004h ; 緑 ↓
dw 0B005h ; 水 ↓
dw 0D006h ; 黄 ↓
dw 0F007h ; 白 明るい緑
dw 01008h ; グレー
dw 03009h ; 高赤
dw 0500Ah ; 高青
dw 0700Bh ; 高マゼンダ
dw 0900Ch ; 高緑
dw 0B00Dh ; 高黄
dw 0D00Eh ; 高水
dw 0F00Fh ; 高白
db 'PLASMA',0
dw 00100h ; 黒 暗いオレンジ
dw 01301h ; 青 ↓
dw 02502h ; 赤 ↓
dw 03703h ; マゼンダ ↓
dw 04904h ; 緑 ↓
dw 05B05h ; 水 ↓
dw 06D06h ; 黄 ↓
dw 07F07h ; 白 明るいオレンジ
dw 00108h ; 黒
dw 01309h ; 青
dw 0250Ah ; 赤
dw 0370Bh ; マゼンダ
dw 0490Ch ; 緑
dw 05B0Dh ; 水
dw 06D0Eh ; 黄
dw 07F0Fh ; 白
db 'TROPICAL',0
dw 02280h ; 黒 → 青
dw 040F1h ; 青
dw 02F22h ; 赤
dw 08F63h ; マゼンダ
dw 0F044h ; 緑
dw 0C0F5h ; 水
dw 0CF06h ; 黄
dw 0EEE7h ; 白
dw 02268h ; 黒
dw 040F9h ; 青
dw 02F2Ah ; 赤
dw 08F6Bh ; マゼンダ
dw 0F04Ch ; 緑
dw 0C0FDh ; 水
dw 0CF0Eh ; 黄
dw 0EEEFh ; 白
db 'INIT',0
dw 00000h ; 黒
dw 000B1h ; 青
dw 00B02h ; 赤
dw 00BB3h ; マゼンダ
dw 0B004h ; 緑
dw 0B0B5h ; 水
dw 0BB06h ; 黄
dw 0BBB7h ; 白
dw 04448h ; 黒
dw 000F9h ; 高青
dw 00F0Ah ; 高赤
dw 00FFBh ; 高マゼンダ
dw 0F00Ch ; 高緑
dw 0F0FDh ; 高水
dw 0FF0Eh ; 高黄
dw 0FFFFh ; 高白
dw 0 ; エンドオブデータマーク
_DATA ends
_TEXT segment byte public 'CODE'
main proc near
;
cld
jmp start
tune_1 proc
; Cxxxx (パレットの数値設定)
; の処理(レイア1=文字)
mov al,PLT1_SEL
call palette_Select
tune:
inc [option]
lodsb
cmp al,' '
jbe para_loop
; パレットコードセット
call hex1_to_bin
mov dx,plt_cod_reg
and al,00001111b
out dx,al
; 青
lodsb
cmp al,'0'
jb para_loop
call hex1_to_bin
call write_palette2
; 赤
lodsb
cmp al,'0'
jb para_loop
call hex1_to_bin
call write_palette2
; 緑
lodsb
cmp al,'0'
jb para_loop
call hex1_to_bin
call write_palette2
jmp short skip_blank
tune_1 endp
tune_0 proc
; cxxxx (パレットの数値設定)
; の処理(レイア0=グラフィック)
call palette_select0
jmp tune
tune_0 endp
limit_line proc
; 画面の上と下に線を
; 引く(L1)/消す(L0)
inc [option]
lodsb
cmp al,'1'
je line1
cmp al,'0'
jne para_loop
call reset_line
jmp short skip_blank
line1:
call set_line
jmp short skip_blank
limit_line endp
display_mode proc
inc [option]
lodsb
mov bx,1
cmp al,'L'
je set_d
dec bx
dec bx
cmp al,'-'
je set_d
mov bx,offset CGROUP:crt_data_0
sub al,'0'
je set_d
mov bx,offset CGROUP:crt_data_1
dec ax
je set_d
mov bx,offset CGROUP:crt_data_2
dec ax
jne para_loop
set_d:
mov [doption],bx
jmp short skip_blank
display_mode endp
START:
; 初期メッセージ
; テストパタン表示
mov dx,offset cgroup:c_mes
mov ah,009h
int 021h
; パラメータ解析
mov si,00081h
skip_blank:
lodsb
para_loop:
xor ah,ah
cmp al,cr
je normal_end
cmp al,' '
jbe skip_blank
; パレット数値設定
cmp al,'c'
je tune_0
cmp al,'C'
jne para_d
jmp tune_1
para_d:
; 画面モード設定
cmp al,'D'
je display_mode
; 画面境界線の描画
cmp al,'L'
je limit_line
; 色セット名による設定
mov dx,offset cgroup:work_buff
mov di,dx
mov_str:
stosb
lodsb
cmp al,' '
ja mov_str
xor ax,ax
stosb
; si 保存
dec si
mov bp,si
mov bx,offset cgroup:PAL_DATA
mov si,bx
next_set:
; パレットセット表の終端?
mov di,dx
cmp byte ptr[si],0
je print_help
match_key:
lodsb
scasb
jne unmatch_1
; 0 ならマッチング
cmp al,0
jne match_key
inc [option]
; パレットのセット実行
; レイア 1(文字)セレクト
mov al,PLT1_SEL
call palette_select
mov cx,16
push si
push cx
loop_label:
lodsw
call palette_Set
loop loop_label
; レイア 0(グラフィック)セレクト
mov al,PLT0_SEL
call palette_select
pop cx
pop si
loop_label2:
lodsw
call palette_Set
loop loop_label2
; レイア0,レイア1ともに表示
mov al,00fh
MOV dx,0fda0h
out dx,al
; si 復帰
mov si,bp
jmp skip_blank
normal_end:
cmp [option],0
je print_help
cmp [Doption],0
jne crtc_set
; 白Towns = D2
mov si,offset cgroup:crt_data_2
; 白いTownsかグレーTownsか
; A24桁上がりの有無で判定する
in al,0024h
and al,000000100b
je crtc_set_default
; グレーTowns = D1
mov si,offset cgroup:crt_data_1
jmp short crtc_set_default
crtc_set:
cmp [Doption],-1
je no_crt_set
cmp [Doption],1
je lcon_only
; CRTC に値を設定
mov si,[Doption]
crtc_set_default:
call crtc_data_set
no_crt_set:
call palette_select0
; 終了 system_call
; リタンコード 0
mov ax,04c00h
int 021h
;
skip_keyword:
lodsb
unmatch_1:
cmp al,0
jne skip_keyword
add si,16*2
jmp next_set
main endp
print_help proc
; ヘルプメッセージ表示
mov dx,offset cgroup:help_mes
mov ah,009h
int 021h
; 終了 system_call
; リタンコード 1
mov ax,04c01h
int 021h
print_help endp
lcon_only proc
; LCON.COM (マシーンMさん作)
; の対応
; 画面左のみ背景を広げる
mov al,00bh
mov bx,0007Ah ; 8a
call crtc_data_set1
jmp no_crt_set
lcon_only endp
palette_select0 proc
; レイア0 のセレクト
mov al,PLT0_SEL
palette_select proc
; レイア0/1のセレクト
push ax
mov dx,V_IO_AD_REG
mov al,PRIO_REG
out dx,al
inc dx
inc dx
pop ax
out dx,al
ret
palette_select endp
palette_select0 endp
palette_Set proc
; アナログパレットを
; 設定する。
; in AX
; AL b0-b3 パレットコード
; AL b7-b4 青パレット
; AH b0-b3 赤パレット
; AH b7-b4 緑パレット
;out なし
; AX こわれます
; DX こわれます
; AX,DX以外のレジスタは保存。
push ax
; パレットコード設定
mov dx,plt_cod_reg
and al,00001111b
out dx,al
; 青パレット設定
pop ax
call write_palette
; 赤パレット設定
push ax
ror ax,4
call write_palette
; 緑パレット設定
pop ax
mov al,ah
write_palette:
inc dx
inc dx
and al,11110000b
out dx,al
ret
write_palette2:
rol ax,4
jmp write_palette
palette_Set endp
crtc_data_set proc
; CRTC操作
; in SI CRTSレジスタセットテーブル
xor ax,ax
crtc_data_set_loop:
push ax
lodsw
mov bx,ax
pop ax
call crtc_data_set1
inc ax
cmp al,020H
jb crtc_data_set_loop
ret
; in AL CRTC レジスタ番号
; BX そのレビジスタにセットする値
crtc_data_set1:
push ax
mov dx,CRTC_ADR_REG
out dx,al
mov dx,CRTC_DAT_REG
mov ax,bx
out dx,ax
pop ax
ret
crtc_data_set endp
set_line proc
; DOS画面の
; 上と下に線を引く
push es
call set_line_reg
mov ax,1010101010101010b
call set_line_sub
mov ax,0101010101010101b
set_line_ent:
mov di,80 * 408
call set_line_sub
pop es
ret
set_line_sub:
mov cx,40
rep stosw
ret
set_line endp
set_line_reg proc
mov al,07h
mov dx,0FF81h
out dx,al
mov ax,0c000h
mov es,ax
mov di,80 * 0
ret
set_line_reg endp
reset_line proc
; DOS画面の
; 上と下の線を消す
push es
call set_line_reg
mov ax,0000000000000000b
call set_line_sub
jmp set_line_ent
reset_line endp
hex1_to_bin proc
; 16進文字1文字を
; 2進にする
; Input
; al : 文字
; Output
; al : 数字
; 規定外の文字が入力される
; と 0になる。
; エラー処理は行わない。
cmp al,'0'
jb error_hook
cmp al,'9'
jbe number
cmp al,'A'
jb error_hook
cmp al,'F'
jbe capital
cmp al,'a'
jb error_hook
cmp AL,'f'
ja error_hook
;SMALL:
sub al,'a'-'A'
capital:
sub al,'A'-'0'-10
number:
sub al,'0'
ret
error_hook:
xor al,al
ret
hex1_to_bin endp
_TEXT ends
end main